#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int main() {
    /*暑期集训是学长提升自己的最佳时间段，在集训期间会举办多次排位赛，学长们之间竞争相当激烈，
   每次比赛名次变化都很大。经过一个暑假在训练和比赛，学长的最终排名是什么呢？
输入
第一行输入两个整数m、n，m表示参加集训的学长的人数（m<50),n表示集训期间排位赛的次数（n<20)；
    下面输入n行整数，每行m个数，表示m个学长在每次比赛中做出的题目数，题目数小于15。
输出
输出学长的最终名次，排名规则是按每次比赛的名次相加，数值小的名次在前。
样例输入 Copy
3 2
5 2 6
3 3 4
样例输出 Copy
2 3 1*/
    int m, n;
    cin >> m >> n;
    vector<vector<int>> arr(n, vector<int>(m));
    
    // 输入成绩
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> arr[i][j];
        }
    }
    
    vector<int> rank(m, 0);  // 总名次累加器
    
    for (int i = 0; i < n; i++) {
        vector<pair<int, int>> temp;
        
        // 1. 创建成绩-学号配对表
        for (int j = 0; j < m; j++) {
            temp.push_back({arr[i][j], j});
        }
        
        // 2. 对temp排序（按成绩降序）
        sort(temp.begin(), temp.end(), 
             [](const pair<int, int>& a, const pair<int, int>& b) {
                 return a.first > b.first;
             });
        
        // 3. 计算名次并累加
        int current_rank = 1;
        for (int j = 0; j < m; j++) {
            if (j > 0 && temp[j].first != temp[j-1].first) {
                current_rank = j + 1;
            }
            rank[temp[j].second] += current_rank;
        }
    }
    
    // 到这里rank数组里才是累加好的总名次和
    
    return 0;
}